using System;
using System.Collections.Generic;
using System.Drawing;
using LayerEntity.Persona.RecursosHumanos;

namespace LayerEntity.Persona
{
    public interface IEPersona
    {
        /// <summary>
        /// Id Unico de la Persona Registrada
        /// </summary>
        string IdPersona { get; set; }

        /// <summary>
        /// Id del documento de Identificacion
        /// </summary>
        int IdTipoDocumento { get; set; }

        /// <summary>
        /// Numero del Documento de Identificacion
        /// </summary>
        string NumeroDocumento { get; set; }

        /// <summary>
        /// Razon Social de la Persona
        /// </summary>
        string RazonSocial { get; set; }

        /// <summary>
        /// Nombre Comercial de la Persona
        /// </summary>
        string NombreComercial { get; set; }

        /// <summary>
        /// Apellidos de la Persona a registrar
        /// </summary>
        string Apellidos { get; set; }

        /// <summary>
        /// Nombres de la persona a registrar
        /// </summary>
        string Nombres { get; set; }

        /// <summary>
        /// Identificador unico de Tipo de Persona
        /// </summary>
        string TipoPersonaSistema { get; set; }

        /// <summary>
        /// Observaciones realizadas
        /// </summary>
        string Observacion { get; set; }

        /// <summary>
        /// Id Estado de la Persona
        /// </summary>
        int IdEstado { get; set; }

        /// <summary>
        /// Fecha de Nacimiento, valido solo para Clientes y Empleados
        /// </summary>
        DateTime FechaNacimiento { get; set; }

        /// <summary>
        /// Lugar de Nacimiento, valido solo para Clientes y Empleados
        /// </summary>
        string LugarNacimiento { get; set; }

        /// <summary>
        /// Sexo de la Persona, valido solo para Clientes y Empleados
        /// </summary>
        int Sexo { get; set; }

        /// <summary>
        /// FullName de la Persona
        /// </summary>
        string FullName { get; set; }

        /// <summary>
        /// Id de Tipo de Cliente.
        /// </summary>
        int IdTipoCliente { get; set; }

        /// <summary>
        ///Indica si un cliente (Esta o No Apto para Credito)
        /// </summary>
        Boolean CreditoNoDisponible { get; set; }

        /// <summary>
        /// Indise si el cliente autoriza o nu la visibilidad de su Deuda.
        /// </summary>
        Boolean IsDeudaConfidencial { get; set; }

        int IdTipoProveedor { get; set; }

        /// <summary>
        /// Id de la Profesion del Empleado
        /// </summary>
        int IdProfesion { get; set; }

        /// <summary>
        /// Id del Grado de Instrccion del Empleado
        /// </summary>
        int IdGradoInstruccion { get; set; }

        /// <summary>
        /// Id del Estado Civil del Empleado
        /// </summary>
        int IdEstadoCivil { get; set; }

        /// <summary>
        /// Id del Area del Empelado
        /// </summary>
        int IdArea { get; set; }

        /// <summary>
        /// Id del Cargo del Empleado
        /// </summary>
        int IdCargo { get; set; }

        /// <summary>
        /// Informacion de Planilla, asi el empleado no este Registrado.
        /// </summary>
        EPlanilla Planilla { get; set; }

        Image Imagen { get; set; }

        /// <summary>
        /// Permite agregar un contacto
        /// </summary>
        /// <param name="contact">Inforacion del Contacto a agregar, no debe ser null</param>
        void AddContactInfo(EContacto contact);

        /// <summary>
        /// Permite agregrar un conjunto de contactos
        /// </summary>
        /// <param name="contact">Informacion de los Contactos a agregar, no deben ser nullos.</param>
        void AddContactInfo(List<EContacto> contact);

        /// <summary>
        /// Permite agregar una direccion.
        /// </summary>
        /// <param name="direccion">Informacion de la direccion a agregar.</param>
        void AddAddressInfo(EDireccion direccion);

        /// <summary>
        /// Permite agregar un conjuntos de direcciones.
        /// </summary>
        /// <param name="direccion">Conjunto de Direcciones a agregar, no deben ser nulos.</param>
        void AddAddressInfo(List<EDireccion> direccion);

        /// <summary>
        /// Permite agregar informacion de una cuenta corriente.
        /// </summary>
        /// <param name="ctacte">Informacion de la cuenta corriente a agregar, no debe ser null</param>
        void AddAccountInfo(ECuentasCorrientes ctacte);

        void RemoveAccountInfo(ECuentasCorrientes ctacte);

        /// <summary>
        /// Permite agregar un conjuntos de cuentas corrientes a un proveedor.
        /// </summary>
        /// <param name="ctacte">Informacion de las cuentas corrientes a agregar, no deben ser nulos.</param>
        void AddAccountInfo(List<ECuentasCorrientes> ctacte);

        /// <summary>
        /// Obtiene una lista de todos los contacos registrados para el proveedor actual.
        /// </summary>
        /// <returns>
        /// Un <see cref="List<EContacto>"/> con todos los contactos registrados.
        /// </returns>
        List<EContacto> GetContacts();

        /// <summary>
        /// Obtiene un contacto segun el codigo indicado.
        /// </summary>
        /// <param name="item">Id del contacto a buscar</param>
        /// <returns>Un <see cref="EContacto"/> si el Id existe, de lo contrario null.</returns>
        EContacto GetContacts(int item);

        /// <summary>
        /// Obtiene una lista de todas las direccione registradas.
        /// </summary>
        /// <returns>
        /// Un <see cref="List<EDireccion>"/> con las direcciones registradas.
        /// </returns>
        List<EDireccion> GetAddress();

        /// <summary>
        /// Permite Recuperar la Direccion Principal
        /// </summary>
        /// <returns></returns>
        EDireccion GetPrincipalAddress();

        /// <summary>
        /// Obtiene una lista de direcciones segun el ubigeo indicado.
        /// </summary>
        /// <param name="strUbigeo">Ubigeo en donde se buscaran las direcciones.</param>
        /// <returns>
        /// Un <see cref="List<EDireccion>"/> con las direcciones que coinciden con el ubugeo indicado.
        /// </returns>
        List<EDireccion> GetAddress(string strUbigeo);

        /// <summary>
        /// Obtiene informacion de una direccion, segun el codigo indicado.
        /// </summary>
        /// <param name="item">Id de la Direccion a buscar.</param>
        /// <returns>Un <see cref="EDireccion"/> si el Id existe, de lo contrario null.</returns>
        EDireccion GetAddress(int item);

        /// <summary>
        /// Obtiene una lista de todos las Cuentas corrientes registradas para el proveedor actual-
        /// </summary>
        /// <returns>
        /// Un <see cref="List<ECuentasCorrientes>"/> con todas las Cuentas corrientes registradas.
        /// </returns>
        List<ECuentasCorrientes> GetAccount();

        /// <summary>
        /// Obtiene la informacion de la cuenta corriente segun el codigo indicado.
        /// </summary>
        /// <param name="item">Id de la cuente corriente a buscar.</param>
        /// <returns>Un <see cref="ECuentasCorrientes"/> si el Id existe, de lo contrario null.</returns>
        ECuentasCorrientes GetAccount(int item);

        ECuentasCorrientes GetCtsAccount();

        ECuentasCorrientes GetSueldoAccount();

        object[] ToObject(int operacion, EnumTipoPersona persona);
    }
}